/**
 * CacheUtils.java
 */
package com.ozq.common.util;

import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import net.sf.ehcache.Cache;
import net.sf.ehcache.CacheManager;
import net.sf.ehcache.Element;

/**
 * <缓存对象工具>
 * <p>
 * <功能详细描述>
 * 
 * @author 欧增奇
 * @version [版本号, 2017年10月15日]
 * @see [相关类/方法]
 * @since [产品/模块版本]
 */
public class CacheUtils
{
    static Logger logger = LoggerFactory.getLogger(CacheUtils.class);

    /**
     * 缓存对象
     */
    public static final String DEFAULT_CACHE = "ozqObj";

    /**
     * 文章点击量缓存
     */
    public static final String COUNT_ARTICLE = "ozqCountArticle";

    /**
     * 限制ip访问(一共1分钟，30秒未访问直接删除)
     */
    public static final String IP_LIMIT = "ozqIpLimit";

    /**
     * 接口鉴权(一共2小时，1小时自动过期，时间可以任意配置，页面刷新后过期)
     */
    public static final String TOKEN = "ozqToken";

    /**
     * 缓存单例
     */
    private static CacheManager singletonManager = null;

    /**
     * 根据key获取默认缓存里面的值
     * <p>
     * 默认：缓存对象({@link CacheUtils#DEFAULT_CACHE})<br>
     * 
     * @param key
     *            自定义key
     * @return 当缓存存在返回缓存的value值，不存在返回null
     */
    public static Object get(String key)
    {
        return get(key, DEFAULT_CACHE);
    }

    /**
     * 根据key获取默认缓存里面的值
     * <p>
     * 默认：缓存对象({@link CacheUtils#DEFAULT_CACHE})<br>
     * 
     * @param key
     *            自定义key
     * @param cacheName
     *            缓存的名字
     * @return 当缓存存在返回缓存的value值，不存在返回null
     */
    public static Object get(String key, String cacheName)
    {
        logger.debug("debug key: {}", key);

        if (StringUtils.isEmpty(key))
        {
            return null;
        }

        Cache cache = getCache(cacheName);

        Element element = cache.get(key);
        if (element == null)
        {
            return null;
        }
        return element.getObjectValue();
    }

    /**
     * 添加(更新)key到缓存里面
     * <p>
     * 默认：缓存对象({@link CacheUtils#DEFAULT_CACHE})<br>
     * 
     * @param key
     *            自定义key
     * @param cacheName
     *            缓存的名字 需要添加(更新)值
     */
    public static void put(String key, Object value, String cacheName)
    {
        logger.debug("debug key: {}", key);
        logger.debug("debug value: {}", value);

        Cache cache = getCache(cacheName);
        Element element = new Element(key, value);
        cache.put(element);
    }

    /**
     * 添加(更新)key到缓存里面
     * <p>
     * 默认：缓存对象({@link CacheUtils#DEFAULT_CACHE})<br>
     * 
     * @param key
     *            自定义key
     * @param value
     *            需要添加(更新)值
     */
    public static void put(String key, Object value)
    {
        put(key, value, DEFAULT_CACHE);
    }

    /**
     * 删除key对应缓存里面的值
     * <p>
     * 默认：缓存对象({@link CacheUtils#DEFAULT_CACHE})<br>
     * 
     * @param key
     *            自定义key
     */
    public static void remove(Object key)
    {
        remove(key, DEFAULT_CACHE);
    }

    /**
     * 删除key对应缓存里面的值
     * <p>
     * 默认：缓存对象({@link CacheUtils#DEFAULT_CACHE})<br>
     * 
     * @param key
     *            自定义key
     * @param cacheName
     *            缓存的名字 需要添加(更新)值
     */
    public static void remove(Object key, String cacheName)
    {
        logger.debug("debug key: {}", key);

        Cache cache = getCache(cacheName);
        cache.remove(key);
    }

    /**
     * 获取缓存对象
     * 
     * @param cacheName
     *            配置在ehcache.xml的名称
     * @return 返回缓存的对象
     */
    public static Cache getCache(String cacheName)
    {
        if (singletonManager == null)
        {
            singletonManager = CacheManager.create();
        }
        Cache cache = singletonManager.getCache(cacheName);
        return cache;
    }

}
